/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.MathContext;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPalette;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.RegionUtil;
import org.hibernate.Hibernate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.controlador.backingBean.BKCourier;
import pe.com.cotelasa.scp.controlador.backingBean.BKUbigeo;
import pe.com.cotelasa.scp.controlador.comando.ComandoActualizar;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioFecha;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioCliente;
import pe.com.cotelasa.scp.dominio.service.IServicioCourier;
import pe.com.cotelasa.scp.dominio.service.IServicioIgv;
import pe.com.cotelasa.scp.dominio.service.IServicioProveedor;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoMoneda;
import pe.com.cotelasa.scp.entidad.Cliente;
import pe.com.cotelasa.scp.entidad.Courier;
import pe.com.cotelasa.scp.entidad.Empresa;
import pe.com.cotelasa.scp.entidad.Igv;
import pe.com.cotelasa.scp.entidad.Proveedor;
import pe.com.cotelasa.scp.entidad.Ubigeo;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author WINDOWS 7
 */
@Named(value = "MBCourier")
@Scope("request")
public class MBCourier extends MBGenerico implements IMantenedor, IObserver, Serializable {

    private static Logger logger = Logger.getLogger(MBCourier.class);
    @Inject
    private BKCourier bk;
    @Inject
    private IServicioCourier servicio;
    @Inject
    private IServicioIgv servicioIgv;
    @Inject
    private IServicioCliente servicioCliente;
    @Inject
    private IServicioProveedor servicioProveedor;
    @Inject
    private IServicioTipoMoneda servicioMoneda;
    @Inject
    private MBComponenteFindCliente mbComponenteFindCliente;
    @Inject
    private MBComponenteFindProveedor mbComponenteFindProveedor;
    @Inject
    private MBUbigeo mbUbigeo;
    @Inject
    private BKUbigeo bkUbigeo;
    @Autowired
    BKSession session;

    public String buscarCouriers() {
        try {
            bk.setListaCouriersActivos(servicio.listarCouriersPorFiltro(bk.getCourierBusqueda(), bk.getBusquedaDel(), bk.getBusquedaAl()));
        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            e.printStackTrace();
        }
        return URLPaginacion.Courier.URL_CONSULTAR_COURIER;
    }

    public String mostrar() {
        bk.setCourierBusqueda(new Courier());
        bk.getCourierBusqueda().setIdEmpresa(session.getEmpresa());
        bk.getCourierBusqueda().setTipoFlete('0');
        bk.getCourierBusqueda().setConsignatario("");
        bk.getCourierBusqueda().setCourier("");
        bk.setListaCouriersActivos(null);
        bk.setListaTipoFlete(new ArrayList<String>());
        for (Enum e : Courier.TIPO_FLETE.values()) {
            bk.getListaTipoFlete().add(e.name());
        }
        try{
            bk.setListaMonedas(servicioMoneda.listarTipoMonedasActivos());
        }catch(ServiceException e){
            e.printStackTrace();
        }
        bk.setFechaReporte(new Date());
        return URLPaginacion.Courier.URL_CONSULTAR_COURIER;
    }

    @Override
    public String nuevo() {
        mbUbigeo.addObserver(this);
        mbComponenteFindProveedor.addObserver(this);
        mbComponenteFindCliente.addObserver(this);
        mbUbigeo.addObserver(this);
        bkUbigeo.inicializarValores(null, null, false, null);
        
        bk.setComando(new ComandoGuardar(this));
        
        bk.setCourierFormulario(new Courier());
        bk.getCourierFormulario().setIdEmpresa(session.getEmpresa());
        bk.getCourierFormulario().setTipoFlete('0');

        return URLPaginacion.Courier.URL_FORMULARIO_COURIER;
    }

    @Override
    public String editar() {
        bk.setComando(new ComandoActualizar(this));
        
        mbUbigeo.addObserver(this);
        mbComponenteFindProveedor.addObserver(this);
        mbComponenteFindCliente.addObserver(this);
        mbUbigeo.addObserver(this);

        try {
            bk.setCourierFormulario(servicio.conseguirCourierPorId(bk.getCourierFormulario().getId()));
            bkUbigeo.inicializarValores(bk.getCourierFormulario().getIdUbigeo().getIdPais(), bk.getCourierFormulario().getIdUbigeo(), false, bk.getCourierFormulario().getDescUbicacion());
        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            e.printStackTrace();
        }

        return URLPaginacion.Courier.URL_FORMULARIO_COURIER;
    }

    @Override
    public String guardar() {
        String Url = "";

        bk.getCourierFormulario().setUsrCreacion(session.getUsuario().getUsuario());
        bk.getCourierFormulario().setFecCreacion(new Date());

        try {
            if (bk.getCourierFormulario().getTipoFlete() != '0') {
                Igv igv = servicioIgv.ConseguirIgvPorFecha(bk.getCourierFormulario().getFechac());
                BigDecimal valorIgv = igv.getMonto().divide(new BigDecimal(100));
                
                bk.getCourierFormulario().setValor(bk.getCourierFormulario().getTotal().divide(valorIgv.add(BigDecimal.ONE), MathContext.DECIMAL32));
                bk.getCourierFormulario().setIgv(bk.getCourierFormulario().getTotal().subtract(bk.getCourierFormulario().getValor()));
            } else {
                bk.getCourierFormulario().setNumFactura(null);
                bk.getCourierFormulario().setIgv(null);
                bk.getCourierFormulario().setValor(null);
                bk.getCourierFormulario().setTotal(null);
                bk.getCourierFormulario().setIdMoneda(null);
            }

            servicio.guardarCourier(bk.getCourierFormulario());
            mostrarMensaje("Se guardó satisfactoriamente.");
            Url = URLPaginacion.Courier.URL_CONSULTAR_COURIER;
            buscarCouriers();
        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            e.printStackTrace();
            mostrarError("Ocurrió un error al guardar.");
            Url = URLPaginacion.Courier.URL_FORMULARIO_COURIER;
        }
        return Url;
    }

    @Override
    public String actualizar() {
        String Url = "";
        bk.getCourierFormulario().setUsrModificacion(session.getUsuario().getUsuario());
        bk.getCourierFormulario().setFecModificacion(new Date());
        try {
            if (bk.getCourierFormulario().getTipoFlete() != '0') {
                 Igv igv = servicioIgv.ConseguirIgvPorFecha(bk.getCourierFormulario().getFechac());
                BigDecimal valorIgv = igv.getMonto().divide(new BigDecimal(100));
                
                bk.getCourierFormulario().setValor(bk.getCourierFormulario().getTotal().divide(valorIgv.add(BigDecimal.ONE), MathContext.DECIMAL32));
                bk.getCourierFormulario().setIgv(bk.getCourierFormulario().getTotal().subtract(bk.getCourierFormulario().getValor()));
            } else {
                bk.getCourierFormulario().setNumFactura(null);
                bk.getCourierFormulario().setIgv(null);
                bk.getCourierFormulario().setValor(null);
                bk.getCourierFormulario().setTotal(null);
                bk.getCourierFormulario().setIdMoneda(null);
            }

            servicio.actualizarCourier(bk.getCourierFormulario());
            mostrarMensaje("Se actualizó satisfactoriamente.");
            Url = URLPaginacion.Courier.URL_CONSULTAR_COURIER;
            buscarCouriers();
        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            e.printStackTrace();
            mostrarError("Ocurrió un error al actualizar.");
            Url = URLPaginacion.Courier.URL_FORMULARIO_COURIER;
        }
        return Url;
    }

    public void elegirFlete() {
        System.out.println("tipo flete: "+bk.getCourierFormulario().getTipoFlete());
        if (bk.getCourierFormulario().getTipoFlete() == '0') {
            bk.getCourierFormulario().setNumFactura("000-0000000");
            bk.getCourierFormulario().setTotal(null);
            bk.getCourierFormulario().setIdMoneda(null);
        }
    }

    @Override
    public void eliminar(ActionEvent actionEvent) {
        Courier courier = bk.getCourierSeleccionado();

        try {
            courier = servicio.conseguirCourierPorId(courier.getId());

            courier.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
            courier.setUsrModificacion(session.getUsuario().getUsuario());
            courier.setFecModificacion(new Date());


            //servicioArticulos.actualizarArticulo(articulo);
            buscarCouriers();
            mostrarMensaje("Se elimino el articulo satisfactoriamente");
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al eliminar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    @Override
    public void actualizarObservador(Object object) {

        if (object instanceof Cliente) {
            try {
                Cliente cliente = servicioCliente.conseguirClientePorId(((Cliente) object).getId());
                bk.getCourierFormulario().setIdCliente(cliente);
                bk.getCourierFormulario().setConsignatario(cliente.getRazonSocial());
                bk.getCourierFormulario().setIdUbigeo(cliente.getIdUbigeo());
                bk.getCourierFormulario().setDescUbicacion(cliente.getDescUbicacion());
                bk.getCourierFormulario().setDireccionEnvio(cliente.getDireccionLegal());
                //System.out.println("id pais: "+cliente.getIdUbigeo().getIdPais());
                Hibernate.initialize(cliente.getIdUbigeo().getIdPais());
                bkUbigeo.inicializarValores(cliente.getIdUbigeo().getIdPais(), cliente.getIdUbigeo(), false, cliente.getDescUbicacion());
            } catch (ServiceException e) {
                e.printStackTrace();
            }
        }

        if (object instanceof Proveedor) {
            try{
            Proveedor proveedor = servicioProveedor.conseguirProveedorPorId(((Proveedor) object).getId());
            bk.getCourierFormulario().setIdProveedor(proveedor);
            bk.getCourierFormulario().setCourier(proveedor.getRazonSocial());
            
            } catch (ServiceException e) {
                e.printStackTrace();
            }
        }

        if (object instanceof Map) {
            Map<String, Object> datos = (Map<String, Object>) object;
            bk.getCourierFormulario().setDescUbicacion((String) datos.get("descripcionUbigeo"));
            bk.getCourierFormulario().setIdUbigeo((Ubigeo) datos.get("ubigeo"));
        }
    }

    @Override
    public String ver() {
        try{
            bk.setCourierFormulario(servicio.conseguirCourierPorId(bk.getCourierFormulario().getId()));
        }catch(ServiceException e){
            e.printStackTrace();
        }
        return URLPaginacion.Courier.URL_VER_COURIER;
    }

    @Override
    public String aceptar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String retroceder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String cancelar() {
        return URLPaginacion.Courier.URL_CONSULTAR_COURIER;
    }

    public void reporte() throws IOException {
        List<Courier> lista = new ArrayList<Courier>();
        Courier courierBusqueda = new Courier();
        courierBusqueda.setIdEmpresa(session.getEmpresa());
        courierBusqueda.setFechac(bk.getFechaReporte());
        try {
            lista = servicio.obtenerCourierReporte(courierBusqueda);
        } catch (ServiceException e) {
            e.printStackTrace();
        }
        
        System.out.println("lista: "+lista);

        HSSFWorkbook wb = new HSSFWorkbook();

        HSSFSheet sheet = wb.createSheet("General");

        sheet.setAutobreaks(true);
        sheet.setDefaultColumnWidth(10);
        sheet.setAlternativeFormula(true);
        //sheet.setVerticallyCenter(true);
        sheet.setRowSumsBelow(true);

        HSSFCellStyle borderStyle = wb.createCellStyle();
        borderStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);

        HSSFCellStyle borderDotStyle = wb.createCellStyle();
        borderDotStyle.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);
        borderDotStyle.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);
        borderDotStyle.setBorderRight(HSSFCellStyle.BORDER_DOTTED);
        borderDotStyle.setBorderTop(HSSFCellStyle.BORDER_DOTTED);

        /**
         * ***** fuente para titulo ******************
         */
        HSSFFont titFont = wb.createFont();
        titFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        titFont.setFontHeightInPoints(Short.valueOf("9"));

        HSSFCellStyle titStyle = wb.createCellStyle();
        titStyle.setFont(titFont);
        titStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

        /**
         * ***** fuente para cabecera ******************
         */
        HSSFFont cabFont = wb.createFont();
        cabFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        cabFont.setFontHeightInPoints(Short.valueOf("7"));

        HSSFCellStyle cabStyle = wb.createCellStyle();
        cabStyle.cloneStyleFrom(borderStyle);
        cabStyle.setWrapText(true);
        cabStyle.setFont(cabFont);

        /**
         * ***** fuente normal ******************
         */
        HSSFFont genFont = wb.createFont();
        genFont.setFontHeightInPoints(Short.valueOf("7"));


        HSSFCellStyle genStyleL = wb.createCellStyle();
        genStyleL.cloneStyleFrom(borderDotStyle);
        genStyleL.setFont(genFont);
        genStyleL.setWrapText(true);

        HSSFCellStyle genStyleN = wb.createCellStyle();
        genStyleN.cloneStyleFrom(borderDotStyle);
        genStyleN.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
        genStyleN.setFont(genFont);
        HSSFPalette palette = wb.getCustomPalette();
        palette.setColorAtIndex(HSSFColor.VIOLET.index, (byte) 153, (byte) 153, (byte) 255);

        /**
         * ***** fuente para resultado ******************
         */
        HSSFFont resFont = wb.createFont();
        resFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        resFont.setColor(HSSFColor.WHITE.index);
        resFont.setFontHeightInPoints(Short.valueOf("9"));

        HSSFCellStyle resStyle = wb.createCellStyle();

        resStyle.cloneStyleFrom(borderDotStyle);
        resStyle.setFillForegroundColor(HSSFColor.VIOLET.index);
        resStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        resStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        resStyle.setFont(resFont);


        HSSFRow row = sheet.createRow(1);

        HSSFCell cell = row.createCell(0);

        cell.setCellStyle(titStyle);
        cell.setCellValue("REPORTE COURIERS " + session.getEmpresa().getNombreComercial() + " - PERIODO " + UtilitarioFecha.obtenerAnio(courierBusqueda.getFechac()));
        CellRangeAddress region = new CellRangeAddress(1, 1, 0, 16);
        sheet.addMergedRegion(region);

        int rowCont = 3;

        row = sheet.createRow(rowCont);
        row = armarCabecera(row, cabStyle);

        rowCont++;
        //Date fecha = new Date();
        int i = 1;
        for (Courier courier : lista) {

            /*if (UtilitarioFecha.obtenerMes(fecha) != UtilitarioFecha.obtenerMes(courier.getFechac()) && !courier.equals(lista.get(0))) {
                row = sheet.createRow(rowCont);
                cell = row.createCell(0);
                cell.setCellStyle(resStyle);
                cell.setCellValue(UtilitarioFecha.formatearFecha(fecha, "MMMM - yyyy").toUpperCase());

                region = new CellRangeAddress(rowCont, rowCont, 0, 15);
                RegionUtil.setBorderBottom(CellStyle.BORDER_DOTTED, region, sheet, wb);
                RegionUtil.setBorderTop(CellStyle.BORDER_DOTTED, region, sheet, wb);

                sheet.addMergedRegion(region);

                rowCont++;
            }*/


            row = sheet.createRow(rowCont);
            row = armarContenido(row, genStyleL, genStyleN, courier, i);


            rowCont++;
            i++;
        }
        /*row = sheet.createRow(rowCont);
        cell = row.createCell(0);
        cell.setCellStyle(resStyle);
        cell.setCellValue(UtilitarioFecha.formatearFecha(fecha, "MMMM - yyyy").toUpperCase());

        region = new CellRangeAddress(rowCont, rowCont, 0, 15);
        RegionUtil.setBorderBottom(CellStyle.BORDER_DOTTED, region, sheet, wb);
        RegionUtil.setBorderTop(CellStyle.BORDER_DOTTED, region, sheet, wb);

        sheet.addMergedRegion(region);*/


        rowCont++;

        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        externalContext.setResponseContentType("application/vnd.ms-excel");
        externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"Reporte de Couriers.xls\"");

        wb.write(externalContext.getResponseOutputStream());
        facesContext.responseComplete();


    }

    public HSSFRow armarCabecera(HSSFRow row, HSSFCellStyle titStyle) {

        HSSFCell cell = row.createCell(0);
        cell.setCellStyle(titStyle);
        cell.setCellValue("Nº");

        cell = row.createCell(1);
        cell.setCellStyle(titStyle);
        cell.setCellValue("FECHA");
        
        cell = row.createCell(2);
        cell.setCellStyle(titStyle);
        cell.setCellValue("MES");
        
        cell = row.createCell(3);
        cell.setCellStyle(titStyle);
        cell.setCellValue("Nº TRACKING");

        cell = row.createCell(4);
        cell.setCellStyle(titStyle);
        cell.setCellValue("COURIER");

        cell = row.createCell(5);
        cell.setCellStyle(titStyle);
        cell.setCellValue("REMITENTE");

        cell = row.createCell(6);
        cell.setCellStyle(titStyle);
        cell.setCellValue("COMPAÑIA");

        cell = row.createCell(7);
        cell.setCellStyle(titStyle);
        cell.setCellValue("CONSIGNATARIO");

        cell = row.createCell(8);
        cell.setCellStyle(titStyle);
        cell.setCellValue("DESTINO");

        cell = row.createCell(9);
        cell.setCellStyle(titStyle);
        cell.setCellValue("CONTENIDO");

        cell = row.createCell(10);
        cell.setCellStyle(titStyle);
        cell.setCellValue("FLETE");

        cell = row.createCell(11);
        cell.setCellStyle(titStyle);
        cell.setCellValue("CON CARGO A");

        cell = row.createCell(12);
        cell.setCellStyle(titStyle);
        cell.setCellValue("FACTURA COURIER");

        cell = row.createCell(13);
        cell.setCellStyle(titStyle);
        cell.setCellValue("SIN IGV");

        cell = row.createCell(14);
        cell.setCellStyle(titStyle);
        cell.setCellValue("IGV");

        cell = row.createCell(15);
        cell.setCellStyle(titStyle);
        cell.setCellValue("INC. IGV");

        cell = row.createCell(16);
        cell.setCellStyle(titStyle);
        cell.setCellValue("OBS");

        return row;
    }

    public HSSFRow armarContenido(HSSFRow row, HSSFCellStyle titStyle, HSSFCellStyle genNStyle, Courier courier, int i) {

        HSSFCell cell = row.createCell(0);
        cell.setCellStyle(titStyle);
        cell.setCellValue(i);

        cell = row.createCell(1);
        cell.setCellStyle(titStyle);
        cell.setCellValue(UtilitarioFecha.formatearFecha(courier.getFechac(), "dd/MM/yyyy"));
        
        cell = row.createCell(2);
        cell.setCellStyle(titStyle);
        cell.setCellValue(UtilitarioFecha.formatearFecha(courier.getFechac(), "MMMM").toUpperCase());

        cell = row.createCell(3);
        cell.setCellStyle(titStyle);
        cell.setCellValue(courier.getNumTracking());

        cell = row.createCell(4);
        cell.setCellStyle(titStyle);
        cell.setCellValue(courier.getCourier());

        cell = row.createCell(5);
        cell.setCellStyle(titStyle);
        cell.setCellValue(courier.getRemitente());

        cell = row.createCell(6);
        cell.setCellStyle(titStyle);
        cell.setCellValue(session.getEmpresa().getNombreComercial());

        cell = row.createCell(7);
        cell.setCellStyle(genNStyle);
        cell.setCellValue(courier.getConsignatario());

        cell = row.createCell(8);
        cell.setCellStyle(titStyle);
        cell.setCellValue(courier.getIdUbigeo().getIdPais().getNombre());

        cell = row.createCell(9);
        cell.setCellStyle(titStyle);
        cell.setCellValue(courier.getContenido());

        cell = row.createCell(10);
        cell.setCellStyle(titStyle);
        cell.setCellValue(courier.getTipoFlete() == Courier.TIPO_FLETE.COLLECT.getValor() ? Courier.TIPO_FLETE.COLLECT.name() : Courier.TIPO_FLETE.PREPAID.name());

        cell = row.createCell(11);
        cell.setCellStyle(titStyle);
        cell.setCellValue(courier.getTipoFlete() == Courier.TIPO_FLETE.COLLECT.getValor() ? "CONSIGNATARIO" : session.getEmpresa().getNombreComercial());

        cell = row.createCell(12);
        cell.setCellStyle(titStyle);
        cell.setCellValue(courier.getNumFactura());

        cell = row.createCell(13);
        cell.setCellStyle(genNStyle);
        cell.setCellValue(courier.getValor().doubleValue());

        cell = row.createCell(14);
        cell.setCellStyle(genNStyle);
        cell.setCellValue(courier.getIgv().doubleValue());

        cell = row.createCell(15);
        cell.setCellStyle(genNStyle);
        cell.setCellValue(courier.getTotal().doubleValue());

        cell = row.createCell(16);
        cell.setCellStyle(titStyle);
        cell.setCellValue(courier.getObservacion());


        return row;
    }
}
